/**
 * 二分查找
 * 
 * 给定一个 n 个元素有序的（升序）整型数组 nums 和一个目标值 target  ，写一个函数搜索 nums 中的 target，如果目标值存在返回下标，否则返回 -1。


示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
 

提示：

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/binary-search
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 */
#include "vector"
#include <iostream>

using namespace std;

class Solution
{
private:
  /* data */
public:
  Solution(/* args */);
  ~Solution();
  int search(vector<int> &nums, int target);
};
/**
 * 使用迭代器解题
int Solution::search(vector<int> &nums, int target)
{
  int i = 0;
  vector<int>::iterator v = nums.begin();
  while (v != nums.end())
  {
    // cout << "nums[" << i << "]: " << nums[i] << endl;
    if (nums[i] == target)
    {
      break;
    }
    v++;
    i++;
  }
  if (v == nums.end())
  {
    i = -1;
  }
  return i;
}
*/

// 二分法解题
// 核心mid = (high - low) / 2 + low;
int Solution::search(vector<int> &nums, int target)
{
  // 数组是升序的
  int low = 0;
  int high = nums.size() - 1;
  if(nums[low] > target || nums[high] < target){
    return -1;
  }
  while (low <= high)
  {
    int mid = (high - low) / 2 + low;
    int num = nums[mid];
    if (num == target)
    {
      return mid;
    }
    else if (num < target)
    {
      low = mid + 1;
    }
    else
    {
      high = mid - 1;
    }
  }
  return -1;
}

Solution::Solution(/* args */)
{
}

Solution::~Solution()
{
}

int main(void)
{
  Solution s1;

  vector<int> v1 = {-1, 0, 3, 5, 9, 12};
  int target = 9;
  // int target = 2;

  int res = s1.search(v1, target);

  cout << "res: " << res << endl;
  return 0;
}
